%YAML 1.2
---
# AspNet.sublime-syntax
# 
#  Author:
#    Mike Krüger <mkrueger@novell.com>
# 
#  Copyright (c) 2016 Microsoft Corporation
# 
#  Permission is hereby granted, free of charge, to any person obtaining a copy
#  of this software and associated documentation files (the "Software"), to deal
#  in the Software without restriction, including without limitation the rights
#  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#  copies of the Software, and to permit persons to whom the Software is
#  furnished to do so, subject to the following conditions:
# 
#  The above copyright notice and this permission notice shall be included in
#  all copies or substantial portions of the Software.
# 
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#  THE SOFTWARE.

name: "ASP.NET"
file_extensions:
  - aspx
  - ascx
  - master
  - Master
scope: source.aspnet
contexts:
  main:
    - include: comments
    - include: expressions
    - include: entities
  comments:
    - match: '<[%!]--'
      scope: comment.source.aspnet
      push:
        - include: commenttags
        - match: '-->'
          pop: true
  commenttags:
    - match: '\b((?i:todo)|(?i:fixme)|(?i:hack)|(?i:undone))\b'
      scope: markup.other.source.aspnet
  expressions:
    - match: '<%'
      scope: string.expr.source.aspnet
      push:
        - include: commenttags
        - match: '%>'
          pop: true
  entities:
    - match: '&([\w\d]+|#\d+|#[xX]\h+);'
      scope: constant.character.entity.html
    - match: '<!'
      push:
        - include: intag
        - match: '>'
          pop: true
    - match: '<!\[CDATA\['
      scope: constant.other.inline-data.html
      push:
        - match: '\]\]>'
          pop: true
    - match: '<\?'
      scope: constant.other.inline-data.html
      push:
        - match: '\?>'
          pop: true
    - match: '</'
      scope: entity.name.tag.source.aspnet
      push:
        - match: '>'
          pop: true
    - match: '(<)(\w+)'
      captures:
        1: punctuation.separator.source.aspnet
        2: entity.name.tag.source.aspnet
      push:
        - include: intag
        - match: '>'
          pop: true
  intag:
    - match: '\\b(\\w+)\\b\\s*(=)'
      captures:
        1: entity.other.attribute-name.source.aspnet
        2: punctuation.separator.source.aspnet
    - match: "'"
      scope: string.quoted.single.source.aspnet
      push:
        - match: "('|$\n?)"
          pop: true
    - match: '"'
      scope: string.quoted.double.source.aspnet
      push:
        - match: '("|$\n?)'
          pop: true